package xueqiu

import (
	"fmt"
	"net/http"
	"net/url"

	"gitee.com/lyuanbo/stock-trade/internal/pkg/errorx"
	"github.com/google/uuid"
	"github.com/imroc/req/v3"
	"github.com/pkg/browser"
	"github.com/skip2/go-qrcode"
)

// Login 登录
func (x *XueQiu) Login() error {
	qrUrl, err := x.GenerateQRCode()
	if err != nil {
		return errorx.New("登录失败", err)
	}

	_ = x.RenderQRCodeByConsole(qrUrl)

	return nil
}

type loginResponse struct {
	Success bool   `json:"success"`
	Message string `json:"message"`
	Data    struct {
		QrCode string `json:"qr_code"`
	} `json:"data"`
	ResultCode int `json:"result_code"`
}

// GenerateQRCode 生成二维码
func (x *XueQiu) GenerateQRCode() (string, error) {
	tid, _ := uuid.NewV7()
	deviceId := tid.String()
	resp, err := req.DefaultClient().R().SetCookies(&http.Cookie{Name: "device_id", Value: deviceId}).Post("https://xueqiu.com/snb/provider/generate-qr-code")
	if err != nil {
		return "", fmt.Errorf("获取二维码失败: %w", err)
	}

	var result loginResponse
	if err = resp.UnmarshalJson(&result); err != nil {
		return "", fmt.Errorf("解析返回数据失败: %w", err)
	}

	// 监听二维码状态
	go func() {
		if err := x.ListenQRCode(result.Data.QrCode, deviceId); err != nil {
			fmt.Println("获取二维码失败: ", err)
		}
	}()

	return result.Data.QrCode, nil
}

// ListenQRCode 监听二维码状态
func (x *XueQiu) ListenQRCode(qrUrl string, deviceId string) error {
	return nil
}

// RenderQRCodeByConsole 控制台渲染二维码
func (x *XueQiu) RenderQRCodeByConsole(qrUrl string) error {
	// 生成二维码
	qr, err := qrcode.New(qrUrl, qrcode.Medium)
	if err != nil {
		return fmt.Errorf("生成二维码失败: %w", err)
	}

	// 显示在线 URL
	qrUrl = fmt.Sprintf("https://devtool.tech/api/qrcode?data=%s\n", url.QueryEscape(qrUrl))
	err = browser.OpenURL(qrUrl)
	if err != nil { // 打开浏览器失败
		// 显示在线URL
		fmt.Println(qrUrl)

		// 在命令行显示二维码
		fmt.Println(qr.ToString(true))
	}

	return nil
}
